﻿''=============================================================================
''OMANE - Outils de calcul actuariat emprunteur
''Copyright © 2010 PIERRE TISSOT CONSEIL / NATIXIS ASSURANCES
''=============================================================================
Imports PTIC_Util
Imports System.Collections.ObjectModel
Imports System.Collections.Specialized


''' <summary>
''' Implémentation abstraite de <see cref="IParamV2" />
''' </summary>
''' <remarks></remarks>
<Serializable()> Public MustInherit Class BaseParametre
    Implements IParametre

    Public Sub New(ByVal nom As String, _
                   ByVal description As String, _
                   ByVal methodes_calcul As Boolean())
        _nom = nom
        _description = description
        _methode_Cal = methodes_calcul
    End Sub

#Region "Nom"
    ''' <summary>
    ''' Nom du paramètre interne à l'outil
    ''' </summary>
    Protected _nom As String
    Public ReadOnly Property Nom() As String Implements IParametre.Nom
        Get
            Return _nom
        End Get
    End Property
#End Region
#Region "Description"
    ''' <summary>
    ''' Description du paramètre
    ''' </summary>
    Protected _description As String
    Public ReadOnly Property Description() As String Implements IParametre.Description
        Get
            Return _description
        End Get
    End Property
#End Region
#Region "Nature"
    ''' <summary>
    ''' Nature
    ''' </summary>
    ''' <remarks></remarks>
    Public Overridable ReadOnly Property Nature() As ParamNature Implements IParametre.Nature
        Get
            If ListeSegments.Count = 0 Then Return ParamNature.Unique Else Return ParamNature.Declinee
        End Get
    End Property
#End Region
#Region "Méthode de calcul"
    Private _methode_Cal() As Boolean
    ''' <summary>
    ''' Méthode de calcul attachée au paramètre (Methode_Cal(0)=True/False pour la méthode 1; Methode_Cal(1)=True/False pour la méthode 2)
    ''' </summary>
    ''' <remarks></remarks>
    Public Property Methode_Cal As Boolean() Implements IParametre.Methode_Cal
        Get
            Return _methode_Cal
        End Get
        Set(ByVal value As Boolean())
            _methode_Cal = value
        End Set
    End Property
#End Region
#Region "Requête"
    <NonSerialized()> Private _Requete As PTIC_GestionBDD.RequeteBDD
    Public Property Requete As PTIC_GestionBDD.RequeteBDD Implements IParametre.Requete
        Get
            Return _Requete
        End Get
        Set(ByVal value As PTIC_GestionBDD.RequeteBDD)
            _Requete = value
        End Set
    End Property
#End Region
#Region "Liste des segments"
    'Générer des évènements lorsqu'un élément est ajouté / supprimé de la liste
    'Lorsque l'évènement est intercepté, le traitement sous-jacent doit être mis à jour
    'Eventuellement, les valeurs du paramètre doivent également être mises à jour
    Protected WithEvents _lSegments As New ObservableCollection(Of String)
    ''' <summary>
    ''' Récupération de la valeur des segments du paramètre
    ''' </summary>
    ''' <remarks></remarks>
    Public Overridable ReadOnly Property ListeSegments() As ObservableCollection(Of String) Implements IParametre.ListeSegments
        Get
            Return _lSegments
        End Get
    End Property
    Protected Overridable Sub onListeSegmentsChanged(ByVal sender As Object, ByVal e As NotifyCollectionChangedEventArgs) Handles _lSegments.CollectionChanged
        'La collection de champs en entrée a changé
        'Détecter s'il s'agit d'un ajout ou d'une suppression
        'Mettre à jour le traitement sous jacent (en ajoutant le champs dans le SELECT et dans le GROUP BY)
        'Générer un évènement
        'Lorsque l'évènement est intercepté par la classe enfant, une colonne peut éventuellement être ajoutée
        'A la table...
        If Not Requete Is Nothing Then
            Select Case e.Action
                Case NotifyCollectionChangedAction.Add
                    Requete.addSELECT(e.NewItems(0))
                Case NotifyCollectionChangedAction.Remove
                    Requete.removeSELECT(e.OldItems(0))
                Case NotifyCollectionChangedAction.Reset
                    Requete.clearSELECT(Me.Nom)
            End Select
        End If
    End Sub
    'Une fonction "ajoute_Segment doit vérifier que le segment qu'on cherche à ajouter est bien un champs en entrée
    'de la requête
#End Region
#Region "Valeurs"
    ''' <summary>
    ''' Valeurs prises par le paramètre, fonction éventuelle d'un sous ensemble de segments retenus par l'utilisateur.
    ''' Il s'agit d'un dataTable (Colonnes : seg1 / seg2 / ... / segN / valeurs)
    ''' Dans le cas d'une valeur unique, la table ne comporte qu'une case
    ''' </summary>
    ''' <remarks></remarks>
    Protected _valeurs As DataTable
    ''' <summary>
    ''' Valeurs du paramètre (au format DataTable)
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Overridable Property Valeurs As DataTable Implements IParametre.Valeurs
        Get
            'Lorsque la requête attachée au paramètre n'est pas à jour, la table des valeurs renvoie nothing
            'La table des valeurs ne doit pas pouvoir être modifiée
            Return _valeurs
        End Get
        Set(ByVal value As DataTable)
            If Not value Is Nothing Then
                _valeurs = value
                RaiseEventHasChanged(Me, New EventArgs)
            End If
        End Set
    End Property
#End Region
#Region "Valeur courante non typée"
    <NonSerialized()> Protected _valeurCourante As Object
    ''' <summary>
    ''' Valeur en cours du paramètre (correspondant à une ligne de la DataTable)
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Overridable Property ValeurEnCoursAsObject As Object Implements IParametre.ValeurEnCoursAsObject
        Get
            Return _valeurCourante
        End Get
        Set(ByVal value As Object)
            _valeurCourante = value
        End Set
    End Property
#End Region
#Region "SimulDouble"
    <NonSerialized()> Protected _simulDouble As Double
    ''' <summary>
    ''' Choc à appliquer au paramètre (utile pour les simulations)
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property SimulDouble As Double Implements IParametre.SimulDouble
        Get
            Return _simulDouble
        End Get
        Set(ByVal value As Double)
            _simulDouble = value
        End Set
    End Property
#End Region

    ''' <summary>
    ''' Type
    ''' </summary>
    ''' <remarks></remarks>
    Public MustOverride ReadOnly Property Type() As Type Implements IParametre.Type
    ''' <summary>
    ''' Récupération de la valeur unique du paramètre (=nothing si le paramètre est décliné)
    ''' </summary>
    ''' <remarks></remarks>
    Public MustOverride ReadOnly Property ValeurUniqueAsObject() As Object Implements IParametre.ValeurUniqueAsObject
    ''' <summary>
    ''' Mise à jour des valeurs (lorsque la requête est invalidée)
    ''' </summary>
    ''' <remarks></remarks>
    Public MustOverride Sub MAJValeurs() Implements IParametre.MAJValeurs
    ''' <summary>
    ''' Récupération des valeurs sérializées du paramètre
    ''' </summary>
    ''' <param name="param"></param>
    ''' <remarks></remarks>
    Public MustOverride Sub Deserialize(ByVal param As IParametre) Implements IParametre.deserialize

    <NonSerialized()> Public Event hasChanged As EventHandler Implements IParametre.hasChanged
    Protected Sub RaiseEventHasChanged(ByVal sender As Object, ByVal e As EventArgs)
        RaiseEvent hasChanged(sender, e)
    End Sub

End Class
